#ifndef _THREADPOOL_H
#define _THREADPOOL_H

#include "TaskQueue.h"
#include <vector>
#include <thread>
#include <unistd.h>
#include <iostream>

using std::cout;
using std::endl;
using std::vector;
using std::thread;

class ThreadPool {
public: 
    
    /**
     * @param threadNum
     * @param queSize
     */
    ThreadPool(size_t threadNum, size_t queSize); // 记得显示调用任务队列的有参构造函数
        
    ~ThreadPool(); // 暂无用处
        
    void start(); // 线程池的启动——向vector中创建子线程
        
    void stop();  // 线程池的停止——各线程优雅退出
        
    /**
     * @brief 向任务队列中添加任务（主线程行为）
     * @param pt 返回值类型为void, 无参数的function对象
     */
    void addTask(ElemType && pt);

private: 
    ElemType getTask();  // 从任务队列中获取任务（子线程行为）
    
    void doTask();   // 子线程入口函数

private: 
    size_t _threadNum;         // 子线程数量
    vector<thread> _threads;   // 存放子线程的容器————注意：避免对thread对象的拷贝操作
    size_t _queSize;           // 任务队列大小
    TaskQueue _taskQueue;      // 任务队列 
    bool _isExit;              // 线程池停止标志
};

#endif //_THREADPOOL_H